#include <vector>
#include <iostream>
using namespace std;
/*
n 张多米诺骨牌排成一行，将每张多米诺骨牌垂直竖立。在开始时，同时把一些多米诺骨牌向左或向右推。

每过一秒，倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌。同样地，倒向右边的多米诺骨牌也会推动竖立在其右侧的相邻多米诺骨牌。

如果一张垂直竖立的多米诺骨牌的两侧同时有多米诺骨牌倒下时，由于受力平衡， 该骨牌仍然保持不变。

就这个问题而言，我们会认为一张正在倒下的多米诺骨牌不会对其它正在倒下或已经倒下的多米诺骨牌施加额外的力。

给你一个字符串 dominoes 表示这一行多米诺骨牌的初始状态，其中：

dominoes[i] = 'L'，表示第 i 张多米诺骨牌被推向左侧，
dominoes[i] = 'R'，表示第 i 张多米诺骨牌被推向右侧，
dominoes[i] = '.'，表示没有推动第 i 张多米诺骨牌。
返回表示最终状态的字符串。

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/push-dominoes
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/

class Solution
{
public:
    string pushDominoes(string dominoes)
    {
        int n = dominoes.size();
        int left = 0, right = n - 1;
        for (int i = 0; i < n; i++)
        {
            if (dominoes[i] == '.')
                continue;
            if (dominoes[i] == 'L')
            {
                for (int j = i - 1; j >= 0 && dominoes[j] == '.'; j--)
                {
                    dominoes[j] = 'L';
                }
                continue;
            }
            int len = 0;
            for (int j = i + 1; j < n && dominoes[j] == '.'; j++)
            {
                dominoes[j] = 'R';
                len++;
            }
            int next = i + len + 1;
            if (next == n)
                break;
            if (dominoes[next] == 'R')
                continue;

            int pos = i + len / 2 + 1;
            if (len % 2 == 1)
            {
                dominoes[pos++] = '.';
            }
            while (pos < next)
            {
                dominoes[pos++] = 'L';
            }
            i = next;
        }
        return dominoes;
    }
};